
import axios from "axios";
import tips from "../utils/tips";
import { Message } from 'element-ui'
// 不允许cookie跨域
axios.defaults.withCredentials = false;
//POST请求头
// axios.defaults.headers.post["Content-Type"] = "application/json";

// axios配置
let _axios = axios.create({
    baseURL: process.env.VUE_APP_BASE_API,
    timeout: 120000 // 设置请求超时时间
});

/**
 * 请求拦截器
 * @param {Object} config
 */
_axios.interceptors.request.use(
    function(config) {
        let time = new Date().getTime() / 1000;
        //公共参数
        let data = {
            _t: parseInt(time) // 设置时间戳
        };
        if (sessionStorage.getItem("token")) {
            config.headers['token'] = sessionStorage.getItem("token");
        }

        if (config.method == "get") {
            // GET请求添加时间戳 防止缓存
            config.params = Object.assign(config.params ? config.params : {}, data);
        }
        return config;
    },
    function(error) {
        return Promise.reject(error);
    }
);

/**
 * 响应拦截器
 */
_axios.interceptors.response.use(
    response => {
        if (response.data.data) {
            if (response.data.data.loginState == false) {
                Message({
                    message: '登录已过期，请重新登录',
                    type: 'error',
                    duration: 3 * 1000
                })
                sessionStorage.clear()
                this.$router.push({ path: "/login" });
                return false
            }
        }
        if (response.status === 200 ) {
            let data = response.data; // 响应数据
            let mineType = response.headers["Content-Type"] || "text/plan"; // 获取文件类型
            let fileName =  "服务器不允许获取文件名"; // 正则提取文件名称
            let code = 200;
            return { code, data, fileName, mineType }; // 如果是文件流 返回blob数据 及 文件名称
        }
        if (response.status === 200) {
            if (response.data.code === 999) {
                // 登录已过期
                Message({
                    message: '登录已过期，请重新登录',
                    type: 'error',
                    duration: 3 * 1000
                })
                sessionStorage.clear()
            } else if (response.data.code === 0) {
                tips.error(response.data.msg);
            }
            return response.data;
        }
        // 判断http状态
        if (response.status === 500 || response.status === 502) {
            tips.error("服务器内部错误！");
        } else if (response.status === 404) {
            tips.warning("接口地址错误！");
        } else if (response.status === 403) {
            tips.warning("接口地址禁止访问！");
        } else {
            tips.info(response.data.msg ? response.data.msg : "未知错误");
        }
        return response.data;
    },
    error => {
        console.log(error);
        return tips.error("当前资源已丢失，请联系管理员");
    }
);

/**
 * GET请求
 * @param url 请求URL
 * @param param 参数
 * @returns {Promise<unknown>}
 */
function get(url, params) {
    return new Promise((resolve, reject) => {
        _axios
            .get(url, {
                params: params
            })
            .then(res => {
                if(res && res.data){
                    resolve(res.data);
                }
            })
            .catch(err => {
                reject(err);
            });
    });
}

/**
 * PUT请求
 * @param url 请求URL
 * @param param 参数
 * @returns {Promise<unknown>}
 */
function put(url, params) {
    return new Promise((resolve, reject) => {
        _axios
            .put(url, {
                params: params
            })
            .then(res => {
                if(res && res.data){
                    resolve(res.data);
                }
            })
            .catch(err => {
                reject(err);
            });
    });
}

/**
 * POST请求
 * @param url 请求地址
 * @param data 参数
 * @returns {Promise<unknown>}
 */
function post(url, data) {
    return new Promise((resolve, reject) => {
        _axios
            .post(url, data)
            .then(res => {
                if(res && res.data){
                    resolve(res.data);
                }
            })
            .catch(err => {
                reject(err);
            });
    });
}



/**
 * delete 删除资源请求
 * @param url 请求地址
 * @param params 参数
 * @returns {Promise<unknown>}
 */
function del(url, params) {
    return new Promise((resolve, reject) => {
        _axios
            .delete(url, {
                params: params
            })
            .then(res => {
                if(res && res.data){
                    resolve(res.data);
                }
            })
            .catch(err => {
                reject(err);
            });
    });
}

function postExcel(url, data) {
    return new Promise((resolve, reject) => {
        _axios({
                url: url,
                method: "post",
                data: data,
                responseType: "arraybuffer" // 响应类型
            })
            .then(res => {
                resolve(res);
            })
            .catch(err => {
                reject(err);
            });
    });
}


export default {get, post, put, del,postExcel };